package com.zut.quartz;

import com.zut.service.QuartzService;
import org.quartz.CronTrigger;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.expression.ParseException;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.util.Objects;

@Configuration
public class QuartzConfiguration {

    /**
     * 该方法设置定时执行的任务
     * <p>
     * TargetObject：指定需要定时执行的那个对象
     * targetMethod: 指定需要定时执行的方法
     * concurrent：
     * false:多个job不会并发执行,设置此次定时完成再执行下一次
     * true:多个job并发执行
     *
     * @param quartzService 指定需要定时执行的对象
     * @return
     */

    @Bean(name = "detailFactoryBean")
    public MethodInvokingJobDetailFactoryBean detailFactoryBean(QuartzService quartzService) {
        MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
        bean.setTargetObject(quartzService);
        bean.setTargetMethod("test");
        bean.setConcurrent(false);
        return bean;
    }


    /**
     * 该方法设置触发器（定时任务的执行方式）
     * <p>
     * cronExpression：
     * 0/10 * * * * ?   ===>    表示每10秒执行一次，具体可参考附表。
     *
     * @param detailFactoryBean
     * @return
     */

    @Bean(name = "cronTriggerBean")
    public CronTriggerFactoryBean cronTriggerBean(@Qualifier("detailFactoryBean") MethodInvokingJobDetailFactoryBean detailFactoryBean) {
        CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
        tigger.setJobDetail(Objects.requireNonNull(detailFactoryBean.getObject()));
        try {
            tigger.setCronExpression("0 0 1 * * ?");//每天凌晨一点执行
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return tigger;
    }


    /**
     * 该方法是通过调度工厂执行定时任务
     * <p>
     * triggers：
     * 可放置多个触发器
     *
     * @Qualifier：通过名字寻找对应的触发器（因为默认是通过类型找的触发器，这里的多个都是同一个类型）
     */

    @Bean
    public SchedulerFactoryBean schedulerFactory(@Qualifier("cronTriggerBean") CronTrigger cronTriggerBean) {
        SchedulerFactoryBean bean = new SchedulerFactoryBean();
        bean.setTriggers(cronTriggerBean);
        return bean;
    }
}
